/**
 * @file main.cpp
 * @brief 
 * 
 *       --事件驱动版本，全程只有一个线程，资源消耗低，效率高，更加灵活，代码更加简洁。
 *       --事件循环优先级->
 *              Timer 定时器事件   : 暂无
 *              IO    读写事件     : channel->onread(回调)
 *              idle  空闲事件     : 暂无
 *              
 *              Custom 自定义事件  : Log
 * 
 *         --解释：
 *             loop -> runInloop([]{ 
 *                 回调函数 
 *             })
 *          定义了回调函数，在事件循环loop中添加事件（被封装了），等待处理
 *          
 * 
 * @author Zyan (zyishere2001@qq.com)
 * @version 1.0
 * @date 2022-05-08
 * 
 * @copyright Copyright (c) 2022  Zyanishere2001
 * 
 * @par 修改日志:
 * 
 */

#include "Listener.h"
#include "Resolver.h"
#include "JLog.h"

//==========select demo===========
#define firewall_demo
//#define json_demo

#ifdef firewall_demo
int main(){
    //内存检测
    HV_MEMCHECK
    
    //事件循环
    EventLoopPtr loop(new EventLoop);
    
    //Log初始化
    JLog::init();

    //初始化socket_raw，在loop中添加io事件
    Listener listener(loop ,"127.0.0.1");

    //回调函数
    listener.channel->onread = [&](Buffer* buffer){
        Resovler::resolvePacket(loop,buffer);//在loop中处理
    };
    listener.startRecv();

    //每两秒运行一次
    loop->setInterval(2000,[&](TimerID timerID){
        printf("--- onTimer tid=%ld timerID=%lu time=%lu s\n", hv_gettid(), (unsigned long)timerID, (unsigned long)time(NULL));
        JLog::ERR(loop->loop(),"hello from interval");
    });

    //十秒后结束
    loop->setTimeout(10000,[&](TimerID timerID){
        listener.stop();
        loop->stop();
    });

    loop->run();

    return 0;
}

//#elif defined(json_demo)

int main(){
    JLog::init();
    EventLoopPtr loop(new EventLoop);

    //每两秒运行一次
    loop->setInterval(2000,[&](TimerID timerID){
        printf("--- onTimer tid=%ld timerID=%lu time=%lu s\n", hv_gettid(), (unsigned long)timerID, (unsigned long)time(NULL));
        JLog::ERR(loop->loop(),"hello from interval");
    });

    //十秒后结束
    loop->setTimeout(10000,[&](TimerID timerID){
        JLog::close();

        std::ifstream in("./logs/err.json");
        json j;
        in >> j;

        std::cout<<std::setw(3)<< j <<std::endl;
        std::cout<< j[0] <<std::endl;

        in.close();

        loop->stop();
    });


    loop->run();
    system("pause");
    return 0;
}


#endif